package iso 
{
	import flash.display.*;
	
	/**
	 * Iso 世界
	 * @author StefanieKaka
	 */
	public class IsoWorld extends Sprite 
	{
		/// 构造函数
		public function IsoWorld() 
		{
			m_floor = new Sprite();
			this.addChild(m_floor);
			
			m_world = new Sprite();
			this.addChild(m_world);
			
			m_objects = new Vector.<IsoObject>();
		}
		
///////////////////////////////////////////////////////////////////////////////////////////////////
// 公共域
///////////////////////////////////////////////////////////////////////////////////////////////////
		
		/**
		 * 添加 IsoObject 到 world 容器中
		 * @param	child 添加的 IsoObject 对象
		 */
		public function addChildToWorld(child : IsoObject) : void
		{
			m_world.addChild(child);
			m_objects.push(child);
			child.name = m_objects.length.toString();
		}
		
		/**
		 * 添加 IsoObject 到 floor 容器中
		 * @param	child 添加的 IsoObject 对象
		 */
		public function addChildToFloor(child : IsoObject) : void
		{
			m_floor.addChild(child);
		}
		
		/**
		 * 深度排序
		 */
		public function sort() : void
		{
			bubbleSort(m_objects);
			//quickSort(m_objects, 0, m_objects.length - 1);
			for (var i : int = 0; i < m_objects.length; ++i)
				m_world.setChildIndex(m_objects[i], i);
		}

///////////////////////////////////////////////////////////////////////////////////////////////////
// 私有域
///////////////////////////////////////////////////////////////////////////////////////////////////

		/// 冒泡排序
		private function bubbleSort(objects : Vector.<IsoObject>) : void
		{
			var change : Boolean = true;			// 判断是否交换
			var length : int = objects.length;
			for (var i : int = 0; i < length && change; ++i)
			{
				change = false;
				for (var j : int = length - 1; j > i; --j)
				{
					var obj1 : IsoObject = m_objects[j];
					var obj2 : IsoObject = m_objects[j - 1];
					if (compareDepth(obj1, obj2) < 0)
					{
						change = true;
						m_objects[j - 1] = obj1;
						m_objects[j] = obj2;
					}
				}
			}
		}

		/// 分割
		private function partition(objects : Vector.<IsoObject>, low : int, high : int) : int
		{
			var obj : IsoObject = objects[low];
			var pivotkey : Number = objects[low].depth;
			
			while (low < high)
			{
				// 向左寻找小于 pivotkey(枢轴) 的数, 将比枢轴记录小的记录交换到低端
				while (low < high && objects[high].depth >= pivotkey)
					--high;
				objects[low] = objects[high];
				
				// 向右寻找大于 pivotkey(枢轴) 的数, 将比枢轴记录大的记录交换到高端
				while (low < high && objects[low].depth <= pivotkey)
					++low;
				objects[high] = objects[low];
			}
			
			objects[low] = obj;
			return low;
		}
		
		/// 快速排序
		private function quickSort(objects : Vector.<IsoObject>, low : int, high : int) : void
		{
			if (low < high)
			{
				var pivotloc : int = partition(objects, low, high);
				quickSort(objects, low, pivotloc - 1);
				quickSort(objects, pivotloc + 1, high);
			}
		}
		
		/// 比较两个 IsoObject 对象的深度
		private function compareDepth(obj1 : IsoObject, obj2 : IsoObject) : Number
		{
			return obj1.depth - obj2.depth;
		}

		private var m_floor : Sprite = null;
		private var m_world : Sprite = null;
		private var m_objects : Vector.<IsoObject> = null;
	}

}